﻿#ifndef UNITCONVERT_H
#define UNITCONVERT_H
#include "MeasureView_global.h"
#include <QString>

namespace Qly {
/**
 * @brief The UnitConvert class 这个类用来进行单位换算。
 *   比如将 um 单位换算为 mm。或者将角度换算为弧度。
 */
class UnitConvert
{
public:
    enum LENGTH_UNIT{km, m, cm, mm, um, nm, autoLengthUnit};
    enum AREA_UNIT {km2, m2, cm2, mm2, um2, nm2, autoAreaUnit};
    UnitConvert();
    void setPrecision(uint8_t precision);
    int precision() {return m_precision;}
    /**
     * @brief convert 长度单位换算
     * @param inUnit 输入数据的单位
     * @param value 输入数据的数值
     * @param outUnit  输出数据的单位，如果是 autoLengthUnit 则自动选择合适的单位。
     * @param valueString 输出数值的字符串表示。
     * @param unitString
     * @return
     */
    double convert(LENGTH_UNIT inUnit, double value, LENGTH_UNIT outUnit, QString &valueString, QString &unitString);
    double convert(AREA_UNIT inUnit, double value, AREA_UNIT outUnit, QString &valueString, QString &unitString);

    double convert2(LENGTH_UNIT inUnit, double value, LENGTH_UNIT outUnit, QString &valueString, QString &unitString);
    double convert2(AREA_UNIT inUnit, double value, AREA_UNIT outUnit, QString &valueString, QString &unitString);

    void replaceLength(QString &text, double value, QString label, QString unitLabel);
    void replaceArea(QString &text, double value, QString label, QString unitLabel);
private:
    /// 将当前的单位转换为国际单位制 m 或者 m2
    double convertTo_m(LENGTH_UNIT inUnit, double value);
    double convertTo_m2(AREA_UNIT inUnit, double value);

    /// 将标准单位转换为目标单位
    double mToTargetUnit(LENGTH_UNIT outUnit, double value_m, QString &unitString);
    double m2ToTargetUnit(AREA_UNIT outUnit, double value_m, QString &unitString);

    /// 将结果转换为字符串，保留 precision 位小数
    QString convertToString(double value, uint8_t precision);
    uint8_t m_precision;
};

}

#endif // UNITCONVERT_H
